Base de datos en : https://raw.githubusercontent.com/unalyticsteam/bases-de-datos/master/auto-mpg.csv
# cargando base de datos
auto <- read.csv("../../data/tema2/auto-mpg.csv")
str(auto)
## 'data.frame': 398 obs. of 9 variables:
## $ No : int 1 2 3 4 5 6 7 8 9 10 ...
## $ mpg : num 28 19 36 28 21 23 15.5 32.9 16 13 ...
## $ cylinders : int 4 3 4 4 6 4 8 4 6 8 ...
## $ displacement: num 140 70 107 97 199 115 304 119 250 318 ...
## $ horsepower : int 90 97 75 92 90 95 120 100 105 150 ...
## $ weight : int 2264 2330 2205 2288 2648 2694 3962 2615 3897 3755 ...
## $ acceleration: num 15.5 13.5 14.5 17 15 15 13.9 14.8 18.5 14 ...
## $ model_year : int 71 72 82 72 70 75 76 81 75 76 ...
## $ car_name : Factor w/ 305 levels "amc ambassador brougham",..: 66 184 165 86 8 18 11 79 42 112 ...
Notemos que la estructura del dataframe auto nos muestra la variable cylinders (cilindros) como variable tipo numérico y nuestro conocimiento de la base nos indica que esta deber ser categórica, por tanto la convertimos como sigue.
auto$cylinders <- factor(auto$cylinders)
str(auto)
## 'data.frame': 398 obs. of 9 variables:
## $ No : int 1 2 3 4 5 6 7 8 9 10 ...
## $ mpg : num 28 19 36 28 21 23 15.5 32.9 16 13 ...
## $ cylinders : Factor w/ 5 levels "3","4","5","6",..: 2 1 2 2 4 2 5 2 4 5 ...
## $ displacement: num 140 70 107 97 199 115 304 119 250 318 ...
## $ horsepower : int 90 97 75 92 90 95 120 100 105 150 ...
## $ weight : int 2264 2330 2205 2288 2648 2694 3962 2615 3897 3755 ...
## $ acceleration: num 15.5 13.5 14.5 17 15 15 13.9 14.8 18.5 14 ...
## $ model_year : int 71 72 82 72 70 75 76 81 75 76 ...
## $ car_name : Factor w/ 305 levels "amc ambassador brougham",..: 66 184 165 86 8 18 11 79 42 112 ...
Ahora la variable cylinders es categórica y esta posee 5 niveles
head(auto, 5)
## No mpg cylinders displacement horsepower weight acceleration model_year
## 1 1 28 4 140 90 2264 15.5 71
## 2 2 19 3 70 97 2330 13.5 72
## 3 3 36 4 107 75 2205 14.5 82
## 4 4 28 4 97 92 2288 17.0 72
## 5 5 21 6 199 90 2648 15.0 70
## car_name
## 1 chevrolet vega 2300
## 2 mazda rx2 coupe
## 3 honda accord
## 4 datsun 510 (sw)
## 5 amc gremlin
Usemos la función attach para poder acceder a las variables del dataframe directamente, o sea si necesidad que tener que acceder por índices o con el signo dólar $
attach(auto)
Para hacer un histograma de frecuencias se usa la función hist(), cuyos parámetros (argumentos) principales son:
hist(acceleration, col ="red", xlab = "Aceleracion",ylab = "Frecuencias", breaks= 16, main = "Histograma de la aceleración")
Para combinar el histograma con el gráfico de densidad se necesita hacer este con las frecuencias relativas y no las absolutas, esto se indica con el parametro prob=TRUE
y la curva que representa la densidad se grafica con la función lines()
. Para dibujar solo la densidad de usa el siguiente código plot(density(acceleration))
hist(acceleration, probability = TRUE)
lines(density(acceleration))
# linea con vertical de la media.
abline(v=mean(acceleration), col="red", lwd=5)
Para hacer un diagrma de caja y bigotes se usa la función boxplot()
boxplot(mpg, xlab= "Millas por galón", main = "Diagrama de caja y bigotes de mpg")
# para agregar la media (con linea y con punto)
points(mean(mpg), col="red", pch = 19)
abline(h=mean(mpg), col = "blue")
Creando boxplox de mpg (millas por galón) diferenciando por model_year (anño del modelo)
boxplot(mpg ~ model_year, main="Millas por galón por año")
library(dplyr)
## Warning: package 'dplyr' was built under R version 3.5.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# calculemos las medias por año
mu <- auto %>% group_by(model_year) %>% summarise(medias_year = mean(mpg))
Grafiquemos las medias por cada año.
boxplot(mpg ~ model_year, main="Millas por galón por año")
points(mu$medias_year, col="red", pch=19, type = "b")
legend("topright", legend = "media", col = "red", pch = 19)
Nota: En el graifco se puede observar que tanto en media como en mediana el numero de millas recorridas por galón muestra una tendencia creciente a medida que aumentan los años.
Para hacer un diagrama de dispersión se usa la función plot()
plot (mpg ~ horsepower)
Nota: En este gráfico podermos observar la relacion de la variable mpg en funcion de la variable hoserpower y notamos que a mayor horsepower menor son las millas que recorre por galón.
Grafiquemos usando colores
plot (mpg ~ horsepower, col=cylinders)
Grafiquemos usando la función plot y los puntos función poinst para tener mas control sobre los colores de las distintas categorías.
plot(mpg ~ horsepower, type ="n")
with(subset(auto, cylinders==3), points(mpg~horsepower, col="skyblue"))
with(subset(auto, cylinders==4), points(mpg~horsepower, col="blue"))
with(subset(auto, cylinders==5), points(mpg~horsepower, col="green"))
with(subset(auto, cylinders==6), points(mpg~horsepower, col="orange"))
with(subset(auto, cylinders==8), points(mpg~horsepower, col="red"))
# agregemos una leyenda
legend("topleft", legend = levels(cylinders), col=c("skyblue","blue","green","orange","red"), pch=19)
Para hacer una matriz de dispersión se usa la función pairs
plot(~mpg+displacement+horsepower+weight)
# plot(auto[, c("mpg","displacement","horsepower","weight")])
# tambien se puede usar la función pairs()
Nota: Con este gráfico podemos observar la relación de las cada una de las variables curzadas con las otras.(NO tendencia)
tabla <- table(cylinders)
barplot(tabla)
La función par me sirve para configurar los parametros de los gráficos con los que voy a trabajar, para observar los parametros de los gráficos escriba en la consola el comando par()
# Ej: configurando el color del titulo y el color de fondo
par(col.main ="red", bg="gray")
plot(mpg, main = "Millas por galón")
Con la funcion par()
tambien puedo configurar la cantidad de graficos a mostrar en el Viewer
# Para configuración con la cantidad de gráficos c(2,2) (dos filas y dos columas = 4 gráfcos)
par(mfrow=c(2,2))
#gráfico1
hist(mpg)
#gráfico2
plot(density(mpg))
#gráficos3
hist(mpg, probability = T)
lines(density(mpg))
#graficos4
hist(mpg, probability = T, col = "blue")
lines(density(mpg))
Gráfico cuantil-cuantil, nos permite verficar si un conjunto de datos viene de una distribucion teorica dada, usemos la función qqnorm() para verificar normalidad (visualmente) de una variable dada.
qqnorm(mpg)
Gráficos especializados, elegantes y enfocado a datos multivariados.
para cargar libreria
# para instalar el paquete
#install.packages(lattice)
library(lattice)
## Warning: package 'lattice' was built under R version 3.5.3
Usemos el mismo dataframe
auto <- read.csv("../../data/tema2/auto-mpg.csv")
auto$cylinders <- factor(auto$cylinders)
bwplot(~auto$mpg | auto$cylinders, main = "Mpg según cilindros")
#require(dplyr)
bwplot(~mpg | cylinders, data=auto)
mu <- auto %>% group_by(cylinders) %>% summarise(medias = mean(mpg))
xyplot(mpg~weight | cylinders, data = auto, main = "Peso vs consumo vs cilindro ")
densityplot(mpg~weight | cylinders, data = auto)
ggplot2 es un paquete de R implementado por Hadley Wickham para la creación de gráfcos de alto nivel si necesidad de tener que preocuparnos por los detalles (leyendas, tipografia, colores). El paquete es basado en la gramática de gráficos (gg), un concepto publicado por Leland Wilkinson en 2005.
Documentación oficial: http://docs.ggplot2.org/current/
Acorde al concepto de ggplot2, un gráfico es la suma de 3 partes fundamentales
Gráfico = Datos + Estética + Geometría
Datos: El dataframe.
Estética:(aes) Sirve para indicar las variables x, y, para controlar el color, tamaño, forma de los puntos…
Geometria:(geom) Corresponde al tipo de gráfico (histograma, box plot, line plot, density plot, dot plot, ….)
Lo que vamos a necesitar:
# ggplot2: para visualización de datos.
install.packages("ggplot2")
# dplyr: para manipulacion de datos.
install.packages("dplyr")
Cargando librerias a la sesion de R studio.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.3
##
## Attaching package: 'ggplot2'
## The following object is masked from 'auto':
##
## mpg
library(dplyr)
Dos principales funciones de ggplot2 para la creación de gráficos.
qplot():
Una función de trazado rápido que es fácil de usar para diagramas simples.
ggplot():
Es una función más flexible que me permite construir un gráifco pieza por pieza
Es una función de traazado rápido puede ser utilizado para crear rápida y fácilmente diferentes tipos de gráficos: gráficos de dispersión, gráficos de violín, histogramas, diagramas de densidad.
El formato simple de la funcion qplot es como sigue:
qplot(x, y = NULL, data, geom="auto")
Otros argumentos de la función qplot()
main xlab ylab
Usemos los datos mtcars que vienen incluidos en R
auto <- read.csv("https://raw.githubusercontent.com/unalyticsteam/bases-de-datos/master/auto-mpg.csv")
auto$cylinders <- factor(auto$cylinders)
Diagrama de puntos o diagrama de dispersión. para representar relación entre dos variables cuantitativas.
qplot(x=mpg, y=weight, data=auto, geom="point", main="Peso vs mpg",
xlab = "millas por galón",
ylab = "Peso(1000lb)")
La función qplot()
es muy parecida a la función plot()
de sistema base de R
qplot(x=mpg, y =weight, data = auto, geom = c("point", "smooth"), method ="lm")
## Warning: Ignoring unknown parameters: method
Cambiando el color acorde a los valores de una variable continua.
qplot(x=mpg, y=weight, data = auto, color = acceleration)
cambiando color y forma acorde a los valores de una variable categoricas (factores)
qplot(x=mpg, y=weight, data= auto, col = cylinders, shape = cylinders)
Los colores puden ser controlados con variables continuas, con variables discretas y variables categóricas.
qplot(x= cylinders , y= mpg, data=auto, geom ="boxplot")
qplot(x= cylinders , y= mpg, data=auto, geom ="boxplot") + stat_summary(fun.y = mean, geom="point", color = "red")
Los gráficos de violín son similares a los diagramas de caja y bigotes, solo que este muestra la funcion de densidad de los datos.
ggplot(data=auto, aes(x=cylinders, y=mpg)) + geom_violin() +
geom_boxplot(width = 0.2) + stat_summary(fun.y = mean, geom="point", color = "red")
qplot(x= mpg, data=auto, geom ="histogram", bins = 20) +
geom_vline(aes(xintercept=mean(mpg)), color ="red", size=2)
qplot(x= mpg, data=auto, geom ="density", bins = 20) + geom_vline(aes(xintercept=mean(mpg)), color = "red")
## Warning: Ignoring unknown parameters: bins
ggplot() es una función mas potente y felixible que qplot() y nos sirve para Construir gráficos pierza por pieza
Diagrama de dispersión.
ggplot(data = auto, aes(x=weight, y=mpg)) + geom_point()
Ahora cambiemos la forma de los puntos
ggplot(data = auto, aes(x=weight, y=mpg)) + geom_point(size = 4, shape=18)
Las funciones geom_point() y geom_density() son capas, podemos combinar multiples capas a cada capa les puedo configurar su estética como color, tamaño, etc.
ggplot(data=auto, aes(x=weight, y=mpg)) + geom_point() + geom_line(color="red")
se usa un subconjunto de los mismos datos para la capa line.
ggplot(data=auto, aes(x=weight, y=mpg)) + geom_point() +
geom_line(data=head(auto,10), aes(x=weight, y=mpg),color="red")
ggplot(data = auto, aes(x = weight, y =mpg)) + geom_point(alpha = 1/2, size=5, aes(color = cylinders)) +
geom_smooth(method = "lm", col="blue") + geom_rug(aes(color=cylinders))
ggplot(data = auto, aes(x = weight, y =mpg)) +
geom_point(aes(color = cylinders, shape = cylinders)) +
geom_smooth(aes(color = cylinders), method = lm, se = FALSE, fullrange = TRUE)
ggplot(data = auto, aes(x = weight, y =mpg)) + geom_point(alpha = 1/2, size=5, aes(color = cylinders)) + geom_smooth(method = "lm", col="blue") + facet_grid(cylinders~.) +
labs(x="Peso") + labs(y="Millas por galón") + labs(title="mpg vs peso")
ggplot(data = auto, aes(x = weight, y =mpg)) + geom_point(alpha = 1/2, aes(size = horsepower, color = horsepower)) +
geom_smooth(method = lm, col="blue")
geom_smooth(method="auto", se=TRUE, fullrange=FALSE, level=0.95)
Método: método desuavizado a utilizar. Los valores posibles son lm, glm, gam, loess, rlm.
formula = y ~ poly(x, 3)
level :nivel de confianza a usar. por Default el valor es de 0.95
ggplot(data=auto, aes(x=mpg)) + geom_density() + geom_vline(aes(xintercept = mean(mpg)), color ="red", size = 2, linetype ="dashed")
Tambien se puede hacer con.
ggplot(data=auto, aes(x=mpg)) + stat_density()
library(dplyr)
mu <- auto %>% group_by(cylinders) %>% summarise(medias=mean(mpg))
ggplot(data=auto, aes(x=mpg)) + geom_density(aes(color=cylinders, fill=cylinders)) + geom_vline(data=mu, aes(xintercept=medias, color =cylinders))
Cambiando manualmente los colores
scale_color_manual()
scale_fill_manual()
scale_color_brewer()
scale_fill_brewer()
scale_color_grey()
scale_fill_grey()
ggplot(data=auto, aes(x=mpg)) + geom_density(aes(color=cylinders)) + geom_vline(data=mu, aes(xintercept=medias, color =cylinders)) + scale_color_grey()
ggplot(data=auto, aes(x=mpg)) + geom_density(aes(color=cylinders)) + geom_vline(data=mu, aes(xintercept=medias, color =cylinders)) +
scale_color_manual(values = c("#c1b741", "#4286f4", "#999999", "#E69F00", "#ce1c2e"))
ggplot(data= auto, aes(x=acceleration)) + geom_histogram(bins = 30, color = "gray") +
geom_vline(aes(xintercept=mean(acceleration)), color = "red") + geom_vline(aes(xintercept=median(acceleration)), color = "blue")
ggplot(data= auto, aes(x=acceleration)) + geom_histogram(aes(y=..density..)) +
geom_density(color = "red")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Se usa para visualizar relaciones entre variables continuas
Se usara la base de datos mtcars que viene por defecto en R
ggplot(data = mtcars, aes(x=wt, y=mpg)) + geom_line(linetype ="dashed", color = "red")
ggplot(data = mtcars, aes(x=wt, y=mpg)) + geom_line(aes(color = as.factor(carb))) +
labs(color = "Carburadores")
Quantile - Quantile plot, se utilizan para verificar si un conjuto de datos dado Sigue la distribución normal.
ggplot(data= auto, aes(sample=mpg)) + stat_qq(data=auto,aes(color=cylinders))
Para contar frecuencias de una variable categorica
ggplot(data=auto, aes(x=cylinders)) + geom_bar(color = "blue", fill="white")
# crenado otra variable categorica
auto$weigth2 <- ifelse(auto$weight > 2804, "muy pesado", "poco pesado")
auto$weigth2 <- factor(auto$weigth2)
suma <- auto %>% group_by(cylinders, auto$weigth2) %>% summarise(suma2= sum(mpg))
ggplot(data=auto, aes(x= cylinders, y = mpg, fill=weigth2)) + geom_bar(stat = "identity")
ggplot(data=auto[1:20,], aes(x=mpg, y=weight)) + geom_text(aes(label = car_name),
size = 3)
## ggrepel
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 3.5.3
ggplot(data=auto[1:5,], aes(x=mpg, y=weight)) +
geom_point() + geom_label_repel(aes(label=car_name))
Trabajemos con la base diamonds (diamantes) que viene incluido en R
ggplot(data= diamonds, aes(x=carat, y=price)) + geom_hex(bins=50)
## Warning: package 'hexbin' was built under R version 3.5.3
coord_polar()
df <- data.frame(
group = c("Male", "Female", "Child"),
value = c(25, 25, 50))
head(df)
## group value
## 1 Male 25
## 2 Female 25
## 3 Child 50
ggplot(df, aes(x="", y = value, fill=group)) +
geom_bar(width = 1, stat = "identity") + coord_polar("y", start=0)
The function below can be used for changing titles and labels:
p + ggtitle(“Main title”): Adds a main title above the plot
p + xlab(“X axis label”): Changes the X axis label
p + ylab(“Y axis label”): Changes the Y axis label
p + labs(title = “Main title”, x = “X axis label”, y = “Y axis label”):
library(ggplot2)
library(plotly)
## Warning: package 'plotly' was built under R version 3.5.3
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
gapminder <- read.csv("https://raw.githubusercontent.com/unalyticsteam/bases-de-datos/master/gapminder.csv")
p <- ggplot(data = gapminder, aes(y=lifeExp, x= gdpPercap, colour = continent, alpha = 0.5)) + geom_point(aes(size=pop, frame=year, ids=country)) + scale_x_log10()
## Warning: Ignoring unknown aesthetics: frame, ids
print(p)
ggplotly(p)
library("gridExtra")
library("cowplot")
plot_grid(grafico1, grafico2, grafico3, labels = c("A", "B", "C"),
ncol = 2, nrow = 2)
# para guardar graficos en pdf
pdf("myplot.pdf")
myplot <- ggplot(mtcars, aes(wt, mpg)) + geom_point()
print(myplot)
dev.off()
#para guardar graficos en png.
png("myplot.png")
print(myplot)
dev.off()
# 1. Create a plot: displayed on the screen (by default)
ggplot(mtcars, aes(wt, mpg)) + geom_point()
# 2.1. Save the plot to a pdf
ggsave("myplot.pdf")
# 2.2 OR save it to png file
ggsave("myplot.png")